<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>ES6数组的新功能</title>
    </head>
    <body></body>
    <script>
        /**
         *  首先先列举一下：
         *      @@iterator      返回一个包含数组健对值的迭代器对象，可以通过同步调用得到数组元素的键对值
         *      copyWithin      复制数组中一系列元素到同一数组指定的起始位置
         *      entries         返回包含数组所有键值对的@@iterator
         *      includes        如果数组中存在某个元素返回 true 否则返回 false
         *      find            根据回调函数给定的条件从数组中查找元素如果找到返回这个元素
         *      findIndex       根据回调函数给定的条件从数组中查找元素如果找到 返回索引
         *      fill            用于静态数值填充
         *      from            根据已经有的数组创建一个新数组
         *      keys            返回包含所有索引的@@iterator
         *      of              根据传入的参数创建一个新的数组
         *      values          返回包含数组中所有值的@@iterator
         *
         * */

        //  1.使用 for...of循环来迭代数组
        const numbers = [
            "Sunday",
            "Monday",
            "Tuesday",
            "Wednesday",
            "Thursday",
            "Friday",
            "Saturday",
        ];
        for (const iterator of numbers) {
            console.log(iterator); // "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"
        }
        // 使用 @@iterator 对象
        let iterator = numbers[Symbol.iterator]();
        console.log(iterator.next().value, iterator.next().done);
        console.log(iterator.next().value, iterator.next().done);
        console.log(iterator.next().value, iterator.next().done);
        console.log(iterator.next().value, iterator.next().done);
        console.log(iterator.next().value, iterator.next().done);

        // 数组的 entries、keys、values 方法
        // entries 方法返回包含键值对的@@iterator
        let aEntries = numbers.entries();
        console.log(aEntries.next().value); // [0, 'Sunday']
        console.log(aEntries.next().value); //  [1, 'Monday']
        console.log(aEntries.next().value);
        console.log(aEntries.next().value);
        console.log(aEntries.next().value);

        for (const iterator of aEntries) {
            console.log(iterator);
        }

        // keys 方法返回包含数组索引的@@iterator
        let aKeys = numbers.keys();
        console.log(aKeys.next()); // {value: 0, done: false}
        console.log(aKeys.next()); // {value: 1, done: false}
        console.log(aKeys.next());

        // values 方法返回包含数组值的@@iterator
        let aValues = numbers.values();
        console.log(aValues.next()); // {value: 'Sunday', done: false}
        console.log(aValues.next()); // {value: 'Monday', done: false}
        console.log(aValues.next());

        // 使用 from 方法
        // Array.from 方法是根据已经有的数组创建一个新数组。比如要复制一个 numbers 数组，可以：
        let numbers2 = Array.from(numbers);
        // 还可以穿入一个用来过滤的函数
        let numbers3 = Array.from(numbers, (x) => x.indexOf("u"));
        console.log(numbers3); // [1, -1, 1, -1, 2, -1, 3]

        // Array.of 方法
        // Array.of 方法根据传入的参数创建一个新数组
        let numbers4 = Array.of(1);
        let numbers5 = Array.of(1, 2, 3, 4, 5, 6);
        // 上边两个相当于
        // let numbers4 = [1];
        // let numbers5 = [1,2,3,4,5,6]

        // 使用 fill 方法
        // fill用于静态值填充数组
        let numbersCopy = Array.of(1, 2, 3, 4, 5);
        numbersCopy.fill(0);
        //  numbersCopy 变成了 [0,0,0,0,0]
        // 我们还可以指定索引
        numbersCopy.fill(2, 1); // [0,2,2,2,2]
        // 同理我们可以指定结束索引
        numbersCopy.fill(1, 3, 4); // [0,2,2,1,1]

        // copyWithin 方法
        // 复制数组中的一系列元素到  同一数组  指定的起始位置
        let copyArray = [1, 2, 3, 4, 5, 6];
        copyArray.copyWithin(0, 3); // [4, 5, 6, 4, 5, 6];
        // 如果想把 4，5 这两个值（位置，3，4）复制到位置1，2
        let copyArray = [1, 2, 3, 4, 5, 6];
        copyArray.copyWithin(1, 3, 5); // [1, 4, 5, 4, 5, 6];

        // 排序元素 sort reverse

        // 搜索 indexOf lastIndexOf
        // find findIndex
        // includes

        // 数组转化为字符串：toString 和 join
    </script>
</html>
